package cn.flying.cloud.file.core.service;

import javax.annotation.Resource;

import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;

import cn.flying.cloud.base.oss.exception.OssException;
import cn.flying.cloud.base.oss.model.BucketInfo;
import cn.flying.cloud.base.oss.model.BucketObjectInfo;
import cn.flying.cloud.base.oss.template.OssTemplate;
import cn.flying.cloud.file.bo.FileStorageBo;
import cn.flying.cloud.file.core.factory.OssTemplateFactory;
import cn.flying.cloud.file.service.FileStorageService;

/**
 * 对象存储服务抽象类
 *
 * @author: admin
 * @date: 2025年02月28日 13:28
 * @version: 1.0
 */
public abstract class AbstractOssService implements OssService {

    @Resource
    private FileStorageService fileStorageService;

    OssTemplate getTemplate(String tenantId) {
        FileStorageBo param = new FileStorageBo();
        param.setTenantId(tenantId);
        param.setStatus("Y");
        param.setIsDefault("Y");
        FileStorageBo storage = fileStorageService.getOneObj(param);
        if (storage == null) {
            throw new OssException("没有找到该租户的存储配置！");
        }
        return OssTemplateFactory.createTemplate(storage.getVendorCode(), storage.getEndpoint(), storage.getAccessKey(), storage.getSecretKey(), storage.getBucketName());
    }

//    /**
//     * 创建bucket
//     *
//     * @param bucket bucket名称
//     * @return
//     * @throws OssException
//     */
//    @Override
//    public boolean createBucket(String bucket) {
//        return true;
//    }

    /**
     * 获取所有的bucket
     *
     * @param tenantId 租户ID
     * @return
     * @throws OssException
     */
    @Override
    public List<BucketInfo> getAllBuckets(String tenantId) {
        return null;
    }

    /**
     * 通过bucket名称删除bucket
     *
     * @param tenantId 租户ID
     * @param bucket   bucket名称
     * @return
     * @throws OssException
     */
    @Override
    public boolean deleteBucket(String tenantId, String bucket) {
        return true;
    }

    /**
     * 判断bucket是否存在
     *
     * @param tenantId 租户ID
     * @param bucket   bucket名称
     * @return
     * @throws OssException
     */
    @Override
    public boolean bucketExists(String tenantId, String bucket) {
        return true;
    }

    /**
     * 上传文件
     *
     * @param tenantId 租户ID
     * @param bucket   bucket名称
     * @param file     文件对象
     * @return
     * @throws OssException
     */
    @Override
    public String putObject(String tenantId, String bucket, File file) {

        return null;
    }

//    /**
//     * 上传文件
//     *
//     * @param bucket     bucket名称
//     * @param objectName 对象名称
//     * @param stream     文件流对象
//     * @return
//     * @throws OssException
//     */
//    @Override
//    public String putObject(String bucket, String objectName, InputStream stream) {
//        return null;
//    }

    /**
     * 上传文件
     *
     * @param tenantId    租户ID
     * @param bucket      bucket名称
     * @param objectName  对象名称
     * @param stream      文件流对象
     * @param contextType 文件类型
     * @throws OssException
     */
    @Override
    public String putObject(String tenantId, String bucket, String objectName, InputStream stream, String contextType) {
        return null;
    }

    /**
     * 通过objectName从bucket中删除对象
     *
     * @param tenantId   租户ID
     * @param bucket     bucket名称
     * @param objectName 对象名称
     * @return
     * @throws OssException
     */
    @Override
    public boolean deleteObject(String tenantId, String bucket, String objectName) {
        return true;
    }

    /**
     * 获取文件对象
     *
     * @param tenantId   租户ID
     * @param bucket     bucket名称
     * @param objectName 对象名称
     * @return
     * @throws OssException
     */
    @Override
    public BucketObjectInfo getObject(String tenantId, String bucket, String objectName) {

        return null;
    }

//    /**
//     * 获取文件对象
//     *
//     * @param bucket     bucket名称
//     * @param objectName 对象名称
//     * @return
//     * @throws OssException
//     */
//    @Override
//    public byte[] getObjectBytes(String bucket, String objectName) {
//        return null;
//    }

    /**
     * 获取文件对象
     *
     * @param tenantId   租户ID
     * @param bucket     bucket名称
     * @param objectName 对象名称
     * @param output     输出流对象
     * @return
     * @throws OssException
     */
    @Override
    public void getObject(String tenantId, String bucket, String objectName, OutputStream output) {
    }

    /**
     * 获取对象的url，默认过期时间7天
     *
     * @param tenantId   租户ID
     * @param bucket     bucket名称
     * @param objectName 对象名称
     * @return
     * @throws OssException
     */
    @Override
    public String getObjectUrl(String tenantId, String bucket, String objectName) {
        return null;
    }

//    /**
//     * 获取对象的url
//     *
//     * @param bucket     bucket名称
//     * @param objectName 对象名称
//     * @param expiry     过期时间
//     * @param timeUnit   时间单位
//     * @return
//     * @throws OssException
//     */
//    @Override
//    public String getObjectUrl(String bucket, String objectName, Integer expiry, TimeUnit timeUnit) {
//        return null;
//    }

    /**
     * 从bucket中获取指定前缀prefix的对象集合
     *
     * @param tenantId  租户ID
     * @param bucket    bucket名称
     * @param prefix    前缀
     * @param recursive 是否递归查询
     * @return
     * @throws OssException
     */
    @Override
    public List<BucketObjectInfo> getAllObjectsByPrefix(String tenantId, String bucket, String prefix, boolean recursive) {
        return null;
    }
}
